home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung 2 / Power-Programmierung CD 2 (Tewi)(1994).iso / c / library / bcfamily / source / find.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-12  |  4.6 KB  |  161 lines

  1. //
  2. //      *******************************************************************
  3. //        JdeBP C++ Library Routines          General Public Licence v1.00
  4. //            Copyright (c) 1991,1992     Jonathan de Boyne Pollard
  5. //      *******************************************************************
  6. //
  7. // Part of FamAPI.LIB
  8. //
  9.  
  10. #include "famapi.h"
  11. #include "dosdos.h"
  12.  
  13. #define MAXFINDBUF    128
  14.  
  15. //
  16. //    Each directory search buffer is allocated a segment using DosAllocSeg.
  17. //    Since we *know* that this is DOS real mode, this will not overload
  18. //    an LDT.  If the segment is 0, then we consider it unallocated.
  19. //
  20.  
  21. static unsigned short FindBufSeg[MAXFINDBUF] = { 0 } ;
  22.  
  23. //
  24. //    Search a directory using DOS buffer and copy to OS/2 style buffer
  25. //
  26. // We ignore a "No (more) files" error.
  27. //
  28. static
  29. USHORT _APICALL
  30. DoTheSearch    ( struct DOSFind_t far *PtrFindBuf,
  31.               FILEFINDBUF far *PtrFindBuffer,
  32.               unsigned int BufferLength,
  33.               unsigned int far * PtrSearchCount )
  34. {
  35.     USHORT err = NO_ERROR;
  36.     unsigned int SearchCount = *PtrSearchCount ;
  37.  
  38.     if (SearchCount < 1 || BufferLength < sizeof(FILEFINDBUF))
  39.         return ERROR_BUFFER_OVERFLOW ;
  40.  
  41.     //
  42.     //    Assume that the first one has been done for us
  43.     //
  44.     while (!err && SearchCount) {
  45.         unsigned char cchName ;
  46.         --SearchCount;
  47.  
  48.         //
  49.         //    Copy the DOS find buffer to the OS/2 find buffer
  50.         //
  51.         PtrFindBuffer->fdateCreation =
  52.         PtrFindBuffer->fdateLastAccess =
  53.         PtrFindBuffer->fdateLastWrite = *(FDATE far *)(&PtrFindBuf->wr_date) ;
  54.         PtrFindBuffer->ftimeCreation =
  55.         PtrFindBuffer->ftimeLastAccess =
  56.         PtrFindBuffer->ftimeLastWrite = *(FTIME far *)(&PtrFindBuf->wr_time) ;
  57.         PtrFindBuffer->cbFile = PtrFindBuf->size ;
  58.         // This is a kludge: we round up to next 4K boundary
  59.         PtrFindBuffer->cbFileAlloc = (PtrFindBuf->size + 0x0FFF) & ~0x0FFF ;
  60.         PtrFindBuffer->attrFile = PtrFindBuf->attrib ;
  61.         for (cchName = 0 ; PtrFindBuf->name[cchName] && cchName < 13; cchName++) {
  62.             PtrFindBuffer->achName[cchName] = PtrFindBuf->name[cchName] ;
  63.         }
  64.         PtrFindBuffer->cchName = cchName ;
  65.         PtrFindBuffer->achName[cchName] = '\000';
  66.  
  67.         //
  68.         // Go to the next buffer.  Because the caller may be an HPFS program
  69.         // expecting a longer structure length, we increment by the caller's
  70.         // EXPECTED structure length rather than the ACTUAL structure length.
  71.         //
  72.         PtrFindBuffer = (FILEFINDBUF far *)((unsigned char far *)PtrFindBuffer + BufferLength) ;
  73.  
  74.         // Look for another only if there are more buffers to fill up
  75.         if (SearchCount) err = DosDosFindNext (PtrFindBuf) ;
  76.     }
  77.  
  78.     *PtrSearchCount -= SearchCount ;
  79.  
  80.     return (err == ERROR_NO_MORE_FILES) ? NO_ERROR : err ;
  81. }
  82.  
  83. //
  84. //    Close a search directory
  85. //
  86. USHORT _APICALL
  87. DosFindClose ( unsigned short DirHandle )
  88. {
  89.     if (DirHandle >= MAXFINDBUF) return ERROR_INVALID_TARGET_HANDLE ;
  90.  
  91.     USHORT err = DosFreeSeg(FindBufSeg[DirHandle]) ;
  92.  
  93.     FindBufSeg[DirHandle] = 0 ;
  94.  
  95.     return err ;
  96. }
  97.  
  98. //
  99. //    Find a set of files in a directory
  100. //
  101. USHORT _APICALL
  102. DosFindFirst    ( char far *PtrFileSpec,
  103.                   unsigned short far *PtrDir,
  104.                   unsigned int Attribute,
  105.                   FILEFINDBUF far *PtrFindBuffer,
  106.                   unsigned int BufferLength,
  107.                   unsigned int far *PtrSearchCount,
  108.                   unsigned long Reserved )
  109. {
  110.     if (*PtrDir == -1U) {
  111.         *PtrDir = 0 ;
  112.  
  113.         for (;;) {
  114.             if (FindBufSeg[*PtrDir] == 0)
  115.                 break ;
  116.             else if (*PtrDir >= MAXFINDBUF)
  117.                 return ERROR_NO_MORE_SEARCH_HANDLES ;
  118.             else
  119.                 (*PtrDir)++ ;
  120.         }
  121.     } else if (*PtrDir >= MAXFINDBUF)
  122.         return ERROR_INVALID_TARGET_HANDLE ;
  123.  
  124.     if (FindBufSeg[*PtrDir] == 0) {
  125.         USHORT err = DosAllocSeg((unsigned short) sizeof(struct DOSFind_t),
  126.                                 &FindBufSeg[*PtrDir], 0) ;
  127.         if (err) return err ;
  128.     }
  129.  
  130.     struct DOSFind_t far *PtrFindBuf = (struct DOSFind_t far *)MK_FP(FindBufSeg[*PtrDir], 0) ;
  131.  
  132.     //
  133.     // We will succeed if at least one file can be found
  134.     //
  135.     USHORT err = DosDosFindFirst (PtrFileSpec, Attribute, PtrFindBuf) ;
  136.     if (!err) err = DoTheSearch    (PtrFindBuf, PtrFindBuffer, BufferLength, PtrSearchCount ) ;
  137.     return err ;
  138. }
  139.  
  140. //
  141. //    Find the next set of files in a directory
  142. //
  143. USHORT _APICALL
  144. DosFindNext    ( unsigned short Dir,
  145.               FILEFINDBUF far *PtrFindBuffer,
  146.               unsigned int BufferLength,
  147.               unsigned int far * PtrSearchCount )
  148. {
  149.     if (Dir >= MAXFINDBUF || FindBufSeg[Dir] == 0)
  150.         return ERROR_INVALID_TARGET_HANDLE ;
  151.  
  152.     struct DOSFind_t far *PtrFindBuf = (struct DOSFind_t far *)MK_FP(FindBufSeg[Dir], 0) ;
  153.  
  154.     //
  155.     // We will succeed if at least one more file can be found
  156.     //
  157.     USHORT err = DosDosFindNext (PtrFindBuf) ;
  158.     if (!err) err = DoTheSearch    (PtrFindBuf, PtrFindBuffer, BufferLength, PtrSearchCount ) ;
  159.     return err ;
  160. }
  161.